/*
 * Copyright 2009-2009 Tanesha Project. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 *    1. Redistributions of source code must retain the above copyright notice, 
 *    	 this list of conditions and the following disclaimer.
 *    2. Redistributions in binary form must reproduce the above copyright notice,
 *    	 this list of conditions and the following disclaimer in the documentation 
 *    	 and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 * SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are those 
 * of the authors and should not be interpreted as representing official policies, 
 * either expressed or implied, of the Tanesha Project.
 */
package com.google.api.chart.encoding;

import static com.google.api.chart.encoding.JoinHelper.array;
import static com.google.api.chart.encoding.JoinHelper.join;
import static com.google.api.chart.encoding.JoinHelper.map;

import java.math.BigDecimal;
import java.util.List;

import com.google.api.chart.DataSeriesMaker;
import com.google.api.chart.encoding.JoinHelper.MapHelper;
import com.google.api.chart.encoding.JoinHelper.ToStringHelper;

/**
 * Support for simple data encoding.
 * 
 * @author sorenad
 */
public class SimpleDataEncoder implements DataEncoder {

	private static String SIMPLE_ENCODING = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

	protected String prefix() {
		return "s:";
	}
	
	protected String encodeSingle(int number) {
		// throw new IllegalArgumentException("Cannot encode " + number +
		// " into simple encoding - outside [0, 61]");
		if (number > SIMPLE_ENCODING.length() || number < 0)
			return "_";
		else
			return String.valueOf(SIMPLE_ENCODING.charAt(number));
	}

	protected ToStringHelper<String> joinString = new ToStringHelper<String>() {
		public String string(String obj) {
			return obj;
		};
	};

	protected ToStringHelper<BigDecimal> bigdecimalEncoder = new ToStringHelper<BigDecimal>() {
		public String string(BigDecimal obj) {
			return encodeSingle(obj.toBigInteger().intValue());
		};
	};
	
	protected MapHelper<DataSeriesMaker, String> arrayEncoder = new MapHelper<DataSeriesMaker, String>() {
		@Override
		public String map(DataSeriesMaker obj) {
			return JoinHelper.join(obj.getData(), "", bigdecimalEncoder);
		}
	};

	@Override
	public String encode(final List<DataSeriesMaker> data) {
		return prefix() + join(array(map(data, arrayEncoder), String.class), ",", joinString);
	}

}
